#include <iostream>
#include <vector>

//这只是个示例
/*
 每个语法节点都有一个或多个成员变量，用于存储节点的具体信息。同时，每个节点还提供了访问这些信息的公共成员函数。
 例如，AssignmentNode类有left()和right()两个成员函数，分别返回赋值语句的左值和右值。
 BinaryOperatorNode类有left()、right()和op()三个成员函数，分别返回二元操作符的左操作数、右操作数和操作符本身。
 */

class ASTNode {
public:
    virtual ~ASTNode() {}
};

class ProgramNode : public ASTNode {
public:
    ProgramNode(std::vector<ASTNode*> children) : children_(children) {}
    const std::vector<ASTNode*>& children() const {
        return children_;
    }
private:
    std::vector<ASTNode*> children_;
};

class StatementNode : public ASTNode {
};

class ExpressionNode : public ASTNode {
};

class AssignmentNode : public StatementNode {
public:
    AssignmentNode(ExpressionNode* left, ExpressionNode* right) : left_(left), right_(right) {}
    ExpressionNode* left() const {
        return left_;
    }
    ExpressionNode* right() const {
        return right_;
    }
private:
    ExpressionNode* left_;
    ExpressionNode* right_;
};

class BinaryOperatorNode : public ExpressionNode {
public:
    BinaryOperatorNode(ExpressionNode* left, ExpressionNode* right, std::string op) : left_(left), right_(right), op_(op) {}
    ExpressionNode* left() const {
        return left_;
    }
    ExpressionNode* right() const {
        return right_;
    }
    const std::string& op() const {
        return op_;
    }
private:
    ExpressionNode* left_;
    ExpressionNode* right_;
    std::string op_;
};

class IntegerNode : public ExpressionNode {
public:
    IntegerNode(int value) : value_(value) {}
    int value() const {
        return value_;
    }
private:
    int value_;
};

class IfStatementNode : public StatementNode {
public:
    IfStatementNode(ExpressionNode* condition, StatementNode* then_stmt, StatementNode* else_stmt)
            : condition_(condition), then_stmt_(then_stmt), else_stmt_(else_stmt) {}
    ExpressionNode* condition() const {
        return condition_;
    }
    StatementNode* then_stmt() const {
        return then_stmt_;
    }
    StatementNode* else_stmt() const {
        return else_stmt_;
    }
private:
    ExpressionNode* condition_;
    StatementNode* then_stmt_;
    StatementNode* else_stmt_;
};

// 其他类型的语法节点，例如WhileStatementNode、FunctionNode等等
